# 1.构造15个学生键值对{姓名：分数}, 存入学生字典，如：dct。姓名用'A', 'B', .....'O' 对应，分数为 [35,100]之间的随机整数，输出学生字典；
import random
random.seed(1)  # 设定种子，以便随机测试结果相同
name = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']
dct = {}
for i in name:
    dct[i] = random.randint(35, 100)
print(dct)

# 2.按照学生成绩降序排列输出字典
lst = sorted(dct.items(), key=lambda x: x[1], reverse=True)
print(lst)  # 输出从低到高的统计列表

# 3.计算学生成绩平均分、最大值、最小值（小数点保留2位有效数字，居中对齐）
scores = list(dct.values())
x = sum(scores) / len(scores)
print("平均分：{:^.2f}".format(x))
y = max(scores)
print("最大值：{:^.2f}".format(y))
z = min(scores)
print("最小值：{:^.2f}".format(z))

# 4.统计不及格人数的个数
frequency = 0
for i in scores:
    if i < 60:
        frequency = frequency + 1
print("不及格的人数：", frequency)

# 5.输入学生名字，如W，输出学生对应的分数。输入a或者其他内容如中文、数字需要提醒“请输入正确的学生名字”；假如W同学的分数为65分，如果大于均值，则输出“该生成绩属于上等水平”；等于均值，输出“该生成绩属于中等水平”，反之，输出“该生成绩属于下等水平”。
import time
start = time.perf_counter()
count = 0
while True:
    try:
        name = input('请输入学生姓名：')
        score = dct[name]
        avg_score = sum(scores) / len(scores)
        if score > avg_score:
            print("该生成绩属于上等水平")
        elif score == avg_score:
            print("该生成绩属于中等水平")
        else:
            print("该生成绩属于下等水平")
        count = count + 1
        print("输入次数：", count)
    except KeyError:
        print("请输入正确的学生名字")
        count = count + 1
        continue
    else:
        print("该学生分数:", dct[name])
        print("结束查询!")
        break
end = time.perf_counter()
print('耗时:', end - start)

# 学生成绩可视化
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10, 7))
plt.suptitle("统计可视化")
plt.subplot(231)

x = list(dct.keys())
y = list(dct.values())
plt.bar(x, y, width=0.5, bottom=0, align='edge', color='g', edgecolor='r', linewidth=0.5)
plt.title("学生成绩可视化", size=10)
plt.xlabel("姓名", size=10)
plt.ylabel("成绩", size=10)
plt.show()
